package com.mycode.builder06;

import com.mycode.builder06.resolve.*;

/**
 * 两种 控制类 的省略方式都不影响系统的灵活性和可扩展性，同时还简化了系统结构，但加重了抽象建造者类的职责
 * 如果 construct() 较为复杂，待构建产品的组成部分较多，还是将 construct() 封装在 控制类 中
 * 主要优点：
 *     1、在该模式，客户端不需要知道产品内部组成的细节，将产品本身与产品的创建过程解耦，使得相同的创建过程可以创建不同的产品对象
 *     2、每个具体的建造者都是相对独立的，而与其他建造者无关，因此可以很方便的替换或新增建造者，用户使用不同的具体建造者即可得到
 *     不同的产品对象，增加新的具体建造者无须修改原有类库的代码，系统扩展方便
 *     3、可以精细的控制产品的创建过程，将复杂的产品的创建步骤分解在不同的方法中
 * 主要缺点：
 *     1、建造者模式所创建的产品一般具有较多的共同见，其著称部分相似，如果产品之间差异性很大，不适用建造者模式
 *     2、如果产品的内部结构复杂且多变，可能需要定义很多具体的建造类来实现这种编码，会增加系统的理解难度和运行成本
 * 适用场景：
 *     1、需要生成的产品对象有复杂的内部结构，这些产品对象通常包含多个成员变量
 *     2、创建生成的产品对象的属性互相依赖，需要指定其生成顺序
 *     3、对象的创建过程独立于创建该对象的类，建造者模式通过引入指挥者类，将创建过程封装在指挥者类中，而不是建造者类和客户类中
 *     4、隔离复杂对象的创建和使用，并使得相同的创建过程可以创建不同的产品
 */
public class Bootstrap {

    public static void main(String[] args) {
        ActorBuilder actorBuilder = new AngelBuilder();
        ActorController actorController = new ActorController();
        Actor actor = actorController.construct(actorBuilder);

        String type = actor.getType();
        System.out.println(type + "的外观：");
        System.out.println("性别：" + actor.getSex());
        System.out.println("面容：" + actor.getFace());
        System.out.println("服装：" + actor.getCostume());
        System.out.println("发型：" + actor.getHairstyle());

        System.out.println("-------------------------------------");

        SimpleActorBuilder simpleActorBuilder = new SimpleAngelBuilder();
        Actor construct = SimpleActorBuilder.construct(simpleActorBuilder);
        System.out.println(construct.getType() + "的外观：");
        System.out.println("性别：" + construct.getSex());
        System.out.println("面容：" + construct.getFace());
        System.out.println("服装：" + construct.getCostume());
        System.out.println("发型：" + construct.getHairstyle());

        System.out.println("===========================================");

        SimpleActorBuilder2 simpleActorBuilder2 = new SimpleAngelBuilder2();
        Actor construct1 = simpleActorBuilder2.construct();
        System.out.println(construct1.getType() + "的外观：");
        System.out.println("性别：" + construct1.getSex());
        System.out.println("面容：" + construct1.getFace());
        System.out.println("服装：" + construct1.getCostume());
        System.out.println("发型：" + construct1.getHairstyle());

        System.out.println("++++++++++++++++++++++++++++++++++++++++++");
        HookActorBuilder hookActorBuilder = new HookDevilBuilder();
        HookActorController hookActorController = new HookActorController();
        Actor construct2 = hookActorController.construct(hookActorBuilder);
        System.out.println(construct2.getType() + "的外观：");
        System.out.println("性别：" + construct2.getSex());
        System.out.println("面容：" + construct2.getFace());
        System.out.println("服装：" + construct2.getCostume());
        System.out.println("发型：" + construct2.getHairstyle());

    }
}
